var obj = { a:1,b:2 }

function getA(){
    obj.c = 3;
    return obj
}

function getB(){
    obj.d = 4;
    return obj
}

getA()
// {a: 1, b: 2, c: 3}
getB()
// {a: 1, b: 2, c: 3, d: 4}


var obj = { a:1,b:2 }

function getA(){
    let temp = { ...obj } // ES6 对象展开符
    temp.c = 3
    return temp
}

function getB(){
    let temp = { ...obj } // ES6 对象展开符
    temp.d = 4
    return temp
}

getA()
// {a: 1, b: 2, c: 3}
getB

getB()
// {a: 1, b: 2, d: 4}



let obj = { a:1,b:2,user:{ name:"tom" } }

function getA(){
    let temp = { ...obj } // ES6 对象展开符
    temp.user.age = 23
    return temp
}

function getB(){
    let temp = { ...obj } // ES6 对象展开符
    temp.user.sex = "m"
    return temp
}

getA()
// {a: 1, b: 2, user: {…}}
// a: 1
// b: 2
// user: {name: 'tom', age: 23}
getB()
// {a: 1, b: 2, user: {…}}
// a: 1
// b: 2
// user: {name: 'tom', age: 23, sex: 'm'}


let obj = { a:1,b:2,user:{ name:"tom" } }

function getA(){
    let temp = JSON.parse( JSON.stringify(obj) )  // 深度克隆
    temp.c = 3;
    temp.user.age = 23
    return temp
}

function getB(){
    let temp = JSON.parse( JSON.stringify(obj) )  // 深度克隆
    temp.d = 4;
    temp.user.sex = "m"
    return temp
}

getA()
// {a: 1, b: 2, user: {…}, c: 3}
// a: 1
// b: 2
// c: 3
// user: {name: 'tom', age: 23}

getB()
// {a: 1, b: 2, user: {…}, d: 4}
// a: 1
// b: 2
// d: 4
// user: {name: 'tom', sex: 'm'}

// 工厂函数 = 基于固定的数据结构创建出相同结构的全新对象 = 初始值的复用
//          + 方法必须通过调用才会进行执行，而每次调用都会重新执行方法
//          + js每运行到一个对象定义代码时，会重新在堆中开辟新的存储空间
let createObj = function(){
    return { 
        a:1,
        b:2,
        user:{ 
            name:"tom" 
        } 
    }
}

function getA(){
    let temp = createObj()
    temp.c = 3;
    temp.user.age = 23
    return temp
}

function getB(){
    let temp = createObj()
    temp.d = 4;
    temp.user.sex = "m"
    return temp
}

getA();
// {a: 1, b: 2, user: {…}, c: 3}
// a: 1
// b: 2
// c: 3
// user: {name: 'tom', age: 23}

getB()
// {a: 1, b: 2, user: {…}, d: 4}
// a: 1
// b: 2
// d: 4
// user: {name: 'tom', sex: 'm'}
